import Cookie from 'js-cookie'

// 接口白名单，不校验token
const urlWhiteList = ['/user/login', '/sys/config/init']
const isInWhiteList = url => {
  for (let i = 0; i < urlWhiteList.length; i++) {
    if (url.indexOf(urlWhiteList[i]) > -1) return true
  }
  return false
}

// 401拦截
const resp401 = {
  /**
   * 响应数据之前做点什么
   * @param response 响应对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(response, options) {
    const { message } = options
    if (response.status === 401) {
      message.error('无此接口权限')
    }
    return response
  },
  /**
   * 响应出错时执行
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    const { message } = options
    message.error(error.message)
    return Promise.reject(error)
  }
}

const resp403 = {
  onFulfilled(response, options) {
    const { message } = options
    if (response.status === 403) {
      message.error(`请求被拒绝`)
    }
    return response
  }
}

const reqCommon = {
  /**
   * 发送请求之前做些什么
   * @param config axios config
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(config, options) {
    // console.log(config);
    const { message } = options
    const { url } = config

    // 接口白名单
    if (isInWhiteList(url)) {
      return config
    }

    const token = localStorage.getItem('token') || Cookie.get('token')
    if (token) {

      // 所有接口添加token到头部
      config.headers = Object.assign({}, config.headers, { token })
      return config
    } else {
      window.location.href = window.location.origin + '/#/login'
      message.warning('认证 token 已过期，请重新登录')
      return false
    }
  },

  /**
   * 请求出错时做点什么
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    console.log(error, '------', options)
    const { message } = options
    message.error(error.message)
    return Promise.reject(error)
  }
}

// code码拦截
const resCommon = {
  /**
   * 响应数据之前做点什么
   * @param response 响应对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(response, options) {
    // console.log('响应拦截', response);
    const { message } = options

    if (response.status === 200) {
      if (response.data.code !== '200') {
        message.error(response.data.msg)
      }
      
      if (response.data.code === '99990') {
        options.router.replace({ path: '/login' })
      }

      return response.data
    } 
    return response
  },
  /**
   * 响应出错时执行
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    const { message } = options
    message.error(error.message)
    return Promise.reject(error)
  }
}

export default {
  request: [reqCommon], // 请求拦截
  response: [resp401, resp403, resCommon] // 响应拦截
}
